package com.fuze.navi.common;

import lombok.Getter;
import lombok.ToString;

import java.io.Serializable;

/**
 * @author sepc_
 * @date 3/16/2021 13:53
 * 统一的返回结果
 */
@ToString
public class Result implements Serializable {

    private static final long serialVersionUID = -6956586964810016807L;

    /**
     * 返回的状态码
     */
    @Getter
    private Integer code;

    /**
     * 返回的信息
     */
    @Getter
    private String message;

    /**
     * 返回的数据
     */
    @Getter
    private Object data;

    private Result() {
    }

    private Result(Advice advice) {
        this.code = advice.getCode();
        this.message = advice.getMessage();
    }

    private Result(Integer code , String message){
        this.code = code;
        this.message = message;
    }

    private Result(Advice advice, Object data) {
        this.code = advice.getCode();
        this.message = advice.getMessage();
        this.data = data;
    }

    public static Result ok() {
        return new Result(Advice.SUCCESS);
    }

    public static Result ok(Object data) {
        return new Result(Advice.SUCCESS, data);
    }

    /**
     * 所有的返回错误必须在枚举类型里面先声明
     */
    public static Result err(Advice advice) {
        return new Result(advice);
    }

    /**
     * 这里可见性声明为 protected 的目的是为了让这个方法只在全局异常处理的时候方便统一处理返回值，其他的时候我们应该统一使用枚举
     * @param code 错误码
     * @param message 错误信息
     * @return 统一返回值
     */
    protected static Result err(Integer code ,String message){
        return new Result(code,message);
    }

    /*
    请求在程序里面失败我们不需要数据返回！
     */

}